/**
 * 日期格式化工具类
 * 提供常见的日期时间格式化、相对时间计算等功能
 */

/**
 * 格式化时间（核心方法）
 * @param {Date|String|Number} time 要格式化的时间（支持 Date 对象、时间字符串、时间戳）
 * @param {String} cFormat 格式化模板，如 '{y}-{m}-{d} {h}:{i}:{s}'
 * @returns {String} 格式化后的时间字符串
 */
export function formatTime(time, cFormat) {
  if (arguments.length === 0 || !time) {
    return null;
  }
  const format = cFormat || '{y}-{m}-{d} {h}:{i}:{s}';
  let date;
  // 处理不同类型的时间参数
  if (typeof time === 'object') {
    date = time;
  } else {
    if (typeof time === 'string') {
      if (/^[0-9]+$/.test(time)) {
        // 时间戳兼容（10位秒级/13位毫秒级）
        time = parseInt(time);
        time = time.toString().length === 10 ? time * 1000 : time;
      }
      date = new Date(time);
    } else if (typeof time === 'number') {
      date = new Date(time);
    }
  }
  // 构建格式化所需的时间字段
  const formatObj = {
    y: date.getFullYear(),
    m: date.getMonth() + 1, // 月份从0开始，需+1
    d: date.getDate(),
    h: date.getHours(),
    i: date.getMinutes(),
    s: date.getSeconds(),
    a: date.getDay() // 星期（0-6 对应 日-六）
  };
  // 替换模板中的占位符
  const timeStr = format.replace(/{([ymdhisa])+}/g, (match, key) => {
    const value = formatObj[key];
    if (key === 'a') {
      return ['日', '一', '二', '三', '四', '五', '六'][value];
    }
    // 补零（如月份、日期为1时，显示为01）
    return value.toString().padStart(2, '0');
  });
  return timeStr;
}

/**
 * 简化版日期格式化（默认格式：yyyy-MM-dd）
 * @param {Date|String|Number} time 要格式化的时间
 * @param {String} format 自定义格式（如 'yyyy-MM-dd HH:mm:ss'）
 * @returns {String} 格式化后的日期字符串
 */
export function formatDate(time, format = 'yyyy-MM-dd') {
  // 转换为 formatTime 支持的模板格式
  const cFormat = format
    .replace(/yyyy/g, '{y}')
    .replace(/MM/g, '{m}')
    .replace(/dd/g, '{d}')
    .replace(/HH/g, '{h}')
    .replace(/mm/g, '{i}')
    .replace(/ss/g, '{s}');
  return formatTime(time, cFormat);
}

/**
 * 计算相对时间（如“刚刚”、“5分钟前”、“3小时前”）
 * @param {Date|String|Number} time 要比较的时间
 * @returns {String} 相对时间描述
 */
export function relativeTime(time) {
  const date = new Date(time);
  const now = new Date();
  const diff = now.getTime() - date.getTime(); // 时间差（毫秒）

  const second = 1000;
  const minute = second * 60;
  const hour = minute * 60;
  const day = hour * 24;
  const month = day * 30;
  const year = day * 365;

  if (diff < 0) return '未来时间'; // 防止传入未来时间

  if (diff < minute) {
    return '刚刚';
  } else if (diff < hour) {
    return Math.floor(diff / minute) + '分钟前';
  } else if (diff < day) {
    return Math.floor(diff / hour) + '小时前';
  } else if (diff < month) {
    return Math.floor(diff / day) + '天前';
  } else if (diff < year) {
    return Math.floor(diff / month) + '个月前';
  } else {
    return Math.floor(diff / year) + '年前';
  }
}

/**
 * 判断两个时间是否为同一天
 * @param {Date|String|Number} time1 时间1
 * @param {Date|String|Number} [time2=new Date()] 时间2（默认当前时间）
 * @returns {Boolean} 是否为同一天
 */
export function isSameDay(time1, time2 = new Date()) {
  const date1 = new Date(time1);
  const date2 = new Date(time2);
  return (
    date1.getFullYear() === date2.getFullYear() &&
    date1.getMonth() === date2.getMonth() &&
    date1.getDate() === date2.getDate()
  );
}

/**
 * 获取某一天的开始和结束时间戳（00:00:00 ~ 23:59:59）
 * @param {Date|String|Number} time 目标时间
 * @returns {Object} { start: 当天开始时间戳, end: 当天结束时间戳 }
 */
export function getDayRange(time) {
  const date = new Date(time);
  const start = new Date(date.getFullYear(), date.getMonth(), date.getDate()).getTime();
  const end = start + 24 * 60 * 60 * 1000 - 1; // 当天最后一毫秒
  return { start, end };
}